﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoVuelos.Acceso_a_Datos.Conexion;
using ProyectoVuelos.Entidades;
using MySql.Data.MySqlClient;
using System.Data;
using ProyectoVuelos.Logica.Excepciones;

//VERSION PEDRO
namespace ProyectoVuelos.Acceso_a_Datos.Mysql
{
    public class MySQLCompraVuelo
    {
        ConexionMySQL conex;
        Mensaje msn = new Mensaje();

        public MySQLCompraVuelo()
        {
        }

        #region compra de vuelo(s)
        public Mensaje registrarCompraIda(Compra adquisicion, int identificadorCuenta)
        {

            #region variables locales
            string nombreProcedimiento = "registrarCompraVueloIda";
            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                MySqlCommand comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@idVueloIda", adquisicion.Vuelo.NumeroVuelo);
                comando.Parameters.AddWithValue("@fechaCompra", adquisicion.FechaCompra);
                comando.Parameters.AddWithValue("@montoTotal", adquisicion.MontoTotal);
                comando.Parameters.AddWithValue("@fkCuenta", identificadorCuenta);
                comando.Parameters.AddWithValue("@OutputIdCompra", MySqlDbType.Int32);
                comando.Parameters["@OutputIdCompra"].Direction = ParameterDirection.Output;
                comando.ExecuteNonQuery();
                this.msn.Contenido = comando.Parameters["@OutputIdCompra"].Value.ToString();
                this.msn.Codigo = 100;
                this.msn.TipoMensaje = 'A';

            }
            catch (MySqlException ex)
            {
                this.msn.Contenido = "ERROR: Ocurrio un error en la ejecucion del requerimiento" + ex.Message;
                this.msn.Codigo = ex.ErrorCode;
                this.msn.TipoMensaje = 'B';

            }
            finally
            {
                this.conex.cerrarConexion();

            }
            return this.msn;

        }

        public Mensaje registrarPago(Compra c, Pago p)
        {
            #region variables locales
            int idCompra = 0;
            string nombreProcedimiento = "registrarPago";
            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                MySqlCommand comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputMonto", p.MontoPago);
                comando.Parameters.AddWithValue("@InputBanco", p.Banco);
                comando.Parameters.AddWithValue("@InputTipoPago", p.TipoPago);
                comando.Parameters.AddWithValue("@InputIdCompra", 1);          //DATO FICTICIO
                comando.ExecuteNonQuery();
                this.msn.Contenido = "Pago registrado sastifactoriamente";
                this.msn.Codigo = 400;
                this.msn.TipoMensaje = 'D';
            }
            catch (MySqlException ex)
            {
                //throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
            }
            finally
            {
                this.conex.cerrarConexion();

            }
            return this.msn;

        }
        /**/

        public Mensaje registrarBoleto(BoletoAereo boleto, Compra c)
        {
            #region variables locales
            int idCompra = 0;
            string nombreProcedimiento = "registrarViajero";


            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                MySqlCommand comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputPasaporte", boleto.Usuarios.Pasaporte);
                comando.Parameters.AddWithValue("@InputCedula", boleto.Usuarios.Cedula);
                comando.Parameters.AddWithValue("@InputNombre", boleto.Usuarios.Nombre);
                comando.Parameters.AddWithValue("@InputSegundoNombre", boleto.Usuarios.SegundoNombre);
                comando.Parameters.AddWithValue("@InputApellido", boleto.Usuarios.Apellido);
                comando.Parameters.AddWithValue("@InputSegundoApellido", boleto.Usuarios.SegundoApellido);
                comando.Parameters.AddWithValue("@InputFechaNac", boleto.Usuarios.FechaNacimiento);
                comando.Parameters.AddWithValue("@InputTelefono", boleto.Usuarios.Telefono);
                comando.Parameters.AddWithValue("@InputEmail", boleto.Usuarios.Email);
                comando.Parameters.AddWithValue("@InputSexo", boleto.Usuarios.Sexo);
                comando.Parameters.AddWithValue("@codigoCompra", c.Codigo);
                comando.Parameters.AddWithValue("@InputAsiento", 1); //DATO FICTICIO
                comando.Parameters.AddWithValue("@InputT1", 1);    //DATO FICTICIO
                comando.Parameters.AddWithValue("@InputT2", 1);    //DATO FICTICIO
                comando.Parameters.AddWithValue("@OutputIdBoleto", MySqlDbType.Int32);
                comando.Parameters["@OutputIdBoleto"].Direction = ParameterDirection.Output;
                comando.ExecuteNonQuery();
                this.msn.Contenido = comando.Parameters["@OutputIdBoleto"].Value.ToString();
                this.msn.Codigo = 400;
                this.msn.TipoMensaje = 'D';
            }
            catch (MySqlException ex)
            {
                //throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
            }
            finally
            {
                this.conex.cerrarConexion();

            }
            return this.msn;

        }

        public Mensaje GenerarCodigoBoleto()
        {

            #region variables locales
            string nombreProcedimiento = "GenerarCodigoBoleto";
            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                MySqlCommand comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.Parameters.AddWithValue("@OutputIdBoleto", MySqlDbType.Int32);
                comando.Parameters["@OutputIdBoleto"].Direction = ParameterDirection.Output;
                comando.ExecuteNonQuery();
                this.msn.Contenido = comando.Parameters["@OutputIdBoleto"].Value.ToString();
                this.msn.Codigo = 100;
                this.msn.TipoMensaje = 'A';

            }
            catch (MySqlException ex)
            {
                this.msn.Contenido = "ERROR: Ocurrio un error en la ejecucion del requerimiento" + ex.Message;
                this.msn.Codigo = ex.ErrorCode;
                this.msn.TipoMensaje = 'B';

            }
            finally
            {
                this.conex.cerrarConexion();

            }
            return this.msn;

        }

        public Mensaje registrarFactura(List<BoletoAereo> boletos, int idCuenta, double montoTotal)
        {
            #region variables locales
            int idCompra = 0;
            string nombreProcedimiento = "registrarFactura";
            string nombreProcedimientoDos = "registrarDetalleFactura";
            MySqlCommand comando;
            string idFactura;
            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputMontoTotal", montoTotal);
                comando.Parameters.AddWithValue("@InputCuenta", idCuenta);
                comando.Parameters.AddWithValue("@resultado", MySqlDbType.Int32);
                comando.Parameters["@resultado"].Direction = ParameterDirection.Output;
                comando.ExecuteNonQuery();
                idFactura = comando.Parameters["@resultado"].Value.ToString();
                if (Convert.ToInt32(idFactura) > 0)
                {
                    comando = new MySqlCommand(nombreProcedimientoDos, conex.getConexion());
                    comando.CommandType = CommandType.StoredProcedure;
                    for (int i = 0; i < boletos.Count; i++)
                    {
                        comando.Parameters.AddWithValue("@InputCantidad", 1);
                        comando.Parameters.AddWithValue("@InputPrecio", boletos.ElementAt(i).Precio);
                        comando.Parameters.AddWithValue("@InputIdBoleto", boletos.ElementAt(i).Identificador);
                        comando.Parameters.AddWithValue("@InputIdFactura", idFactura);
                        comando.Parameters.AddWithValue("@resultado", MySqlDbType.Int32);
                        comando.Parameters["@resultado"].Direction = ParameterDirection.Output;
                        comando.ExecuteNonQuery();
                    }
                    this.msn.Contenido = idFactura;
                    this.msn.Codigo = 101;
                    this.msn.TipoMensaje = 'A';
                }

                else
                {
                    this.msn.Contenido = "No se pudo realizar la transaccion";
                    this.msn.Codigo = 101;
                    this.msn.TipoMensaje = 'B';
                }

                //this.resultado = comando.Parameters["@OutputIdCompra"].Value.ToString();


                // (IN InputPasaporte INT, IN InputCedula INT, IN  InputNombre VARCHAR(40), IN InputSegundoNombre VARCHAR(40),IN InputApellido VARCHAR(40),IN InputSegundoApellido VARCHAR(40),IN InputFechaNac DATE,IN InputTelefono INT,IN InputEmail VARCHAR(40),IN InputSexo VARCHAR(1),IN codigoCompra INT)
            }
            catch (MySqlException ex)
            {
                //throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
                this.msn.TipoMensaje = 'F';
            }
            finally
            {
                this.conex.cerrarConexion();
            }
            return this.msn;
        }


        public Factura consultarFactura(int idFactura)
        {
            #region Variables Locales
            string nombreProcedimiento = "consultarFactura";
            string nombreProcedimientoDos = "consultarDetallesFactura";
            MySqlCommand comando;
            MySqlDataReader reader;
            Factura factura = null;
            DetalleFactura detalle = null;
            List<DetalleFactura> lista;
            #endregion

            #region Logica
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputIdFactura", idFactura);
                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    factura = new Factura(Convert.ToString(reader.GetValue(0)), Utilitaria.ObtenerFecha(reader.GetValue(1)).Contenido, Convert.ToDouble(reader.GetValue(2)), null);
                }
            }
            catch (MySqlException ex)
            {
                //throw new BDCompraVueloExcepcion("ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message);
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
                this.msn.TipoMensaje = 'F';
            }
            finally
            {
                this.conex.cerrarConexion();
            }
            return factura;
            #endregion
        }


        public Factura consultarDetallesFactura(int idFactura, Factura factura)
        {
            #region variables locales
            double montoTotal = 0;
            string nombreProcedimiento = "consultarDetallesFactura";
            MySqlCommand comando;
            MySqlDataReader reader;
            List<DetalleFactura> listaAuxiliar = new List<DetalleFactura>();

            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputFkFactura", idFactura);
                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    DetalleFactura detalleAux = new DetalleFactura();
                    detalleAux.Cantidad = Convert.ToInt32(reader.GetValue(1));
                    detalleAux.Precio = Convert.ToDouble(reader.GetValue(0));

                    /* DescripcionDetalleFactura descripcionUno = new DescripcionDetalleFactura();
                     descripcionUno.Nombre = "tipo de tarifa";
                     descripcionUno.Descripcion = Convert.ToString(reader.GetValue(3));
                     descripcion.Add(descripcionUno);

                     DescripcionDetalleFactura descripcionDos = new DescripcionDetalleFactura();
                     descripcionDos.Nombre = "tarifa";
                     descripcionDos.Descripcion = Convert.ToString(reader.GetValue(2));
                     descripcion.Add(descripcionDos);

                     DescripcionDetalleFactura descripcionTres = new DescripcionDetalleFactura();
                     descripcionTres.Nombre = "boleto";
                     descripcionTres.Descripcion = Convert.ToString(reader.GetValue(4));
                     descripcion.Add(descripcionTres);*/
                    detalleAux.Descripcion = Convert.ToString(reader.GetValue(2)) + " " + Convert.ToString(reader.GetValue(3));
                    listaAuxiliar.Add(detalleAux);
                }
                factura.ListaDetalles = listaAuxiliar;

            }
            catch (MySqlException ex)
            {
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
                this.msn.TipoMensaje = 'F';
            }
            finally
            {
                this.conex.cerrarConexion();
            }
            return factura;
        }


        public List<BoletoAereo> consultarBoletos(int idFactura)
        {
            #region variables locales
            string nombreProcedimiento = "consultarBoletos";
            MySqlCommand comando;
            MySqlDataReader reader;
            List<BoletoAereo> boletos = new List<BoletoAereo>();
            #endregion
            try
            {
                conex = new ConexionMySQL();
                conex.abrirConexion();
                comando = new MySqlCommand(nombreProcedimiento, conex.getConexion());
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue("@InputFkFactura", idFactura);
                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    BoletoAereo boleto = new BoletoAereo();
                    Usuario persona = new Usuario();
                    Asiento asiento = new Asiento();
                    persona.Pasaporte = Convert.ToString(reader.GetValue(1));
                    persona.Cedula = Convert.ToString(reader.GetValue(2));
                    persona.Nombre = Convert.ToString(reader.GetValue(3));
                    persona.SegundoNombre = Convert.ToString(reader.GetValue(6));
                    persona.Apellido = Convert.ToString(reader.GetValue(4));
                    persona.SegundoApellido = Convert.ToString(reader.GetValue(7));
                    persona.FechaNacimiento = DateTime.Parse(Convert.ToString(reader.GetValue(5)));
                    asiento.Letra = Convert.ToString(reader.GetValue(8));
                    asiento.Numero = Convert.ToInt32(reader.GetValue(9));
                    asiento.Estatus = true;
                    boleto.CodigoBoleto = Convert.ToString(reader.GetValue(0));
                    boleto.TipoAsiento = Convert.ToString(reader.GetValue(10));
                    boleto.Precio = Convert.ToInt32(reader.GetValue(12));
                    boleto.Asiento = asiento;
                    boleto.Usuarios = persona;
                    boletos.Add(boleto);
                }

            }
            catch (MySqlException ex)
            {
                this.msn.Contenido = "ERROR:Ocurrio un error en la ejecucion del requerimiento:" + ex.Message;
                this.msn.TipoMensaje = 'F';
            }
            finally
            {
                this.conex.cerrarConexion();
            }
            return boletos;
        }
        


     }
  }
  #endregion